/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import suministros.ejb30.TO.NecesidadesSumiDetalleTO;
import suministros.ejb30.TO.NecesidadesSumiTO;
import suministros.ejb30.entity.CodPresupuestal;
import suministros.ejb30.entity.DetallePedidoSuministro;
import suministros.ejb30.entity.DetallePedidoSuministroPK;
import suministros.ejb30.entity.Empresa;
import suministros.ejb30.entity.NecesidadesSumi;
import suministros.ejb30.entity.NecesidadesSumiDetalle;
import suministros.ejb30.entity.NecesidadesSumiDetallePK;
import suministros.ejb30.entity.Pedido;
import suministros.ejb30.entity.Tipo;
import suministros.ejb30.entity.UnidadOrganizativa;
import suministros.ejb30.helper.Utiles_Convertir;

/**
 *
 * @author Renato
 */
@Stateless
public class SumiRegistrarPedido implements SumiRegistrarPedidoLocal {
    
  @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;

  EntityManager em;

  @EJB
  SumiGestionPedidoDAOLocal sumiGestionRemote;

  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }

  public boolean insertarPedido(String usuario, String mac,Pedido pedidoPrinc, List<DetallePedidoSuministro> detallePedido) throws Exception
  {
    boolean retorno = false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();

    try {
      String codigo = this.sumiGestionRemote.getIdPedido(pedidoPrinc);      
      Tipo tipo_suministros= this.sumiGestionRemote.getListaTipoSuministroPorIdSuministro(detallePedido.get(0).getDetallePedidoSuministroPK().getIDSuministro());
      Tipo tipo_orden;
      if(tipo_suministros.getCodigo().equalsIgnoreCase("S")){
         tipo_orden= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_Orden", "02"));
      }else{
          tipo_orden= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_Orden", "01"));
      }
      Tipo tipo_noAtendido = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("id_tipo_estado_pedido", "NA"));
      Tipo tipo_administracion_ninguno=Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_administradorTarea", "00"));
      pedidoPrinc.setCodPedido(codigo);
      pedidoPrinc.setTipoEstadoPedido(tipo_noAtendido);
      pedidoPrinc.setFechaOperacion(new Date());
      pedidoPrinc.setIdTipoOrden(tipo_orden);
      if(pedidoPrinc.getIdProyecto()!=null){
          pedidoPrinc.setIdCodPresupuestal(pedidoPrinc.getIdProyecto().getIdCodPresupuestal());
      }
       pedidoPrinc.setUsuario(usuario);
       pedidoPrinc.setMac(mac);
      pedidoPrinc.setEmpresa(this.em.find(Empresa.class, pedidoPrinc.getEmpresa().getIdEmpresa()));
      this.em.persist(pedidoPrinc);
      for (DetallePedidoSuministro detalle : detallePedido)
      {
          detalle.setIdTipoAdministradorTarea(tipo_administracion_ninguno);
        detalle.setDetallePedidoSuministroPK(new DetallePedidoSuministroPK(pedidoPrinc.getCodPedido(), detalle.getDetallePedidoSuministroPK().getIDSuministro()));
        detalle.setTipoEstadoPedido(tipo_noAtendido);
        this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
      retorno = true;
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return retorno;
  }

   public String insertarPedidoAjusteInventario(String usuario, String mac,Pedido pedidoPrinc, List<DetallePedidoSuministro> detallePedido) throws Exception
  {
    String retorno = "error";
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();

    try {
      String codigo = this.sumiGestionRemote.getIdPedido(pedidoPrinc);
      Tipo tipo_suministros= this.sumiGestionRemote.getListaTipoSuministroPorIdSuministro(detallePedido.get(0).getDetallePedidoSuministroPK().getIDSuministro());
      Tipo tipo_orden;
      if(tipo_suministros.getCodigo().equalsIgnoreCase("S")){
         tipo_orden= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_Orden", "02"));
      }else{
          tipo_orden= Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_Orden", "01"));
      }
      Tipo tipo_Atendido = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("id_tipo_estado_pedido", "AC"));
      Tipo tipo_Almacen = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("id_tipo_estado_pedido", "AA"));
      Tipo tipo_administracion=Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("tipo_administradorTarea", "02"));
      Tipo tipoPrioridad = Utiles_Convertir.convertirToTipo_TipoTO(this.sumiGestionRemote.getTipoCampoCodigo("id_tipo_prioridad", "AP"));
      pedidoPrinc.setCodPedido(codigo);
      pedidoPrinc.setTipoEstadoPedido(tipo_Atendido);
      pedidoPrinc.setFechaOperacion(new Date());
      pedidoPrinc.setIdTipoOrden(tipo_orden);
      pedidoPrinc.setTipoPrioridad(tipo_orden);
      pedidoPrinc.setTipoPrioridad(tipoPrioridad);
      if(pedidoPrinc.getIdProyecto()!=null){
          pedidoPrinc.setIdCodPresupuestal(pedidoPrinc.getIdProyecto().getIdCodPresupuestal());
      }
       pedidoPrinc.setUsuario(usuario);
       pedidoPrinc.setMac(mac);
      pedidoPrinc.setEmpresa(this.em.find(Empresa.class, pedidoPrinc.getEmpresa().getIdEmpresa()));
      this.em.persist(pedidoPrinc);
      for (DetallePedidoSuministro detalle : detallePedido)
      {
        detalle.setIdTipoAdministradorTarea(tipo_administracion);
        detalle.setDetallePedidoSuministroPK(new DetallePedidoSuministroPK(pedidoPrinc.getCodPedido(), detalle.getDetallePedidoSuministroPK().getIDSuministro()));
        detalle.setTipoEstadoPedido(tipo_Almacen);
        this.em.persist(detalle);
      }
      this.em.flush();
      tx.commit();
      retorno = pedidoPrinc.getCodPedido();
    } catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return retorno;
  }

  public void eliminaPedido(String usuario, String mac,Pedido ped) throws Exception
  {
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      this.em.remove(this.em.merge(ped));
      this.em.flush();
      tx.commit();
    }
    catch (Exception e) {
      tx.rollback();
      throw e;
    }
  }

    public boolean procesarRequerimientos(String usuario, String mac,List<NecesidadesSumiTO> listaRequerimiento) throws Exception {
        boolean retorno=false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
         try {

              for (NecesidadesSumiTO deta : listaRequerimiento)
              {
                NecesidadesSumi detalle=new NecesidadesSumi();
                detalle.setIdNecesidad(deta.getIdNecesidad());
                detalle.setCodCentroCosto(deta.getCod_centro_costos());
                detalle.setIDSuministro(deta.getId_suministro());
                detalle.setAno(deta.getAno());
                detalle.setCodUniOrganizativa(deta.getCod_unid_organica());
                detalle.setCantidadTotal(deta.getCantidad_total());
                detalle.setIdCodPresupuestal(deta.getId_cod_presupuestal());
                detalle.setIdProyecto(deta.getIdProyecto());
                detalle.setFechaOperacion(new Date());
                detalle.setCantidadUsada(BigDecimal.ZERO);
                detalle.setCantidadAprobada(BigDecimal.ZERO);
                detalle.setEmpresa(this.em.find(Empresa.class, deta.getEmpresa()));
                detalle.setMac(mac);
                detalle.setUsuario(usuario);
                detalle.setMonto_total(BigDecimal.ZERO);
                if(deta.getOperacion()==NecesidadesSumiTO.insertar){
                    this.em.persist(detalle);
                }
                if(deta.getOperacion()==NecesidadesSumiTO.modificar){
                    this.em.merge(detalle);
                }
                if(deta.getOperacion()==NecesidadesSumiTO.eliminar){
                    this.em.remove(em.merge(detalle));
                }
                this.em.flush();
              }

              tx.commit();
              retorno = true;
        } catch (Exception e) {
          tx.rollback();
          throw e;
        }
        return retorno;
    }

    public boolean procesarDetalleRequerimientos(String usuario, String mac,List<NecesidadesSumiDetalleTO> listaDetalle) throws Exception {
         boolean retorno=false;
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
         try {
            NecesidadesSumiDetalleTO auxiliar=null;
              for (NecesidadesSumiDetalleTO deta : listaDetalle)
              {
                  if(auxiliar==null)
                      auxiliar=deta;
                  
                NecesidadesSumiDetalle detalle=new NecesidadesSumiDetalle(deta.getId_suministro(),
                deta.getId_localidad(),deta.getId_zona(),deta.getIdNecesidad());
                detalle.setMes01(deta.getDmes1());
                detalle.setMes02(deta.getDmes2());
                detalle.setMes03(deta.getDmes3());
                detalle.setMes04(deta.getDmes4());
                detalle.setMes05(deta.getDmes5());
                detalle.setMes06(deta.getDmes6());
                detalle.setMes07(deta.getDmes7());
                detalle.setMes08(deta.getDmes8());
                detalle.setMes09(deta.getDmes9());
                detalle.setMes10(deta.getDmes10());
                detalle.setMes11(deta.getDmes11());
                detalle.setMes12(deta.getDmes12());
                detalle.setSubTotal(deta.getSubtotal());
                detalle.setMes01Aprobado(BigDecimal.ZERO);
                detalle.setMes01Usado(BigDecimal.ZERO);
                detalle.setMes02Aprobado(BigDecimal.ZERO);
                detalle.setMes02Usado(BigDecimal.ZERO);
                detalle.setMes03Aprobado(BigDecimal.ZERO);
                detalle.setMes03Usado(BigDecimal.ZERO);
                detalle.setMes04Aprobado(BigDecimal.ZERO);
                detalle.setMes04Usado(BigDecimal.ZERO);
                detalle.setMes05Aprobado(BigDecimal.ZERO);
                detalle.setMes05Usado(BigDecimal.ZERO);
                detalle.setMes06Aprobado(BigDecimal.ZERO);
                detalle.setMes06Usado(BigDecimal.ZERO);
                detalle.setMes07Aprobado(BigDecimal.ZERO);
                detalle.setMes07Usado(BigDecimal.ZERO);
                detalle.setMes08Aprobado(BigDecimal.ZERO);
                detalle.setMes08Usado(BigDecimal.ZERO);
                detalle.setMes09Aprobado(BigDecimal.ZERO);
                detalle.setMes09Usado(BigDecimal.ZERO);
                detalle.setMes10Aprobado(BigDecimal.ZERO);
                detalle.setMes10Usado(BigDecimal.ZERO);
                detalle.setMes11Aprobado(BigDecimal.ZERO);
                detalle.setMes11Usado(BigDecimal.ZERO);
                detalle.setMes12Aprobado(BigDecimal.ZERO);
                detalle.setMes12Usado(BigDecimal.ZERO);
                detalle.setSubTotalAprobado(BigDecimal.ZERO);
                detalle.setSubTotalUsado(BigDecimal.ZERO);
                detalle.setPrecio(BigDecimal.ZERO);
                detalle.setMonto_aprobado(BigDecimal.ZERO);
                if(deta.getOperacion()==NecesidadesSumiTO.insertar){
                    this.em.persist(detalle);
                }
                if(deta.getOperacion()==NecesidadesSumiTO.modificar){
                    this.em.merge(detalle);
                }
                if(deta.getOperacion()==NecesidadesSumiTO.eliminar){
                    this.em.remove(em.merge(detalle));
                }
                this.em.flush();
              }             
              tx.commit();
              actualizarTotalesRequerimiento(auxiliar);
              retorno = true;
        } catch (Exception e) {
          tx.rollback();
          throw e;
        }
        return retorno;
    }

    public void actualizarTotalesRequerimiento(NecesidadesSumiDetalleTO detalle) throws Exception {
         EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try{
        BigDecimal total=sumiGestionRemote.obtenerTotalDetalleRequerimiento(detalle.getIdNecesidad());
              NecesidadesSumi necPrin=em.find(NecesidadesSumi.class,detalle.getIdNecesidad() );
              necPrin.setFechaOperacion(new Date());
              necPrin.setCantidadTotal(total);
              em.merge(necPrin);
              em.flush();
              tx.commit();
        }catch(Exception e){
            tx.rollback();
            throw e;
        }

    }
       public void aprobarRequerrimientos(String usuario, String mac,List<NecesidadesSumiDetalleTO> listaGeneral,List<NecesidadesSumiTO> generalNecesidades) throws Exception {
        EntityTransaction tx = this.em.getTransaction();
        tx.begin();
        try{
             for(NecesidadesSumiTO neceGeneral: generalNecesidades){
             if(neceGeneral.getDiferencia()==null){
                  NecesidadesSumi nec=em.find(NecesidadesSumi.class,neceGeneral.getIdNecesidad());
                  nec.setCantidadAprobada(neceGeneral.getCantAprobado());
                  em.merge(nec);
             }else{
                  NecesidadesSumi nec=em.find(NecesidadesSumi.class,neceGeneral.getIdNecesidad());
                  BigDecimal dif= neceGeneral.getCantAprobado().subtract(neceGeneral.getDiferencia());
                  nec.setCantidadAprobada(nec.getCantidadAprobada().add(dif));
                  em.merge(nec);
             }

            }
             for(NecesidadesSumiDetalleTO detallereque: listaGeneral){
              NecesidadesSumiDetallePK necepk= new NecesidadesSumiDetallePK(detallereque.getId_suministro(), detallereque.getId_localidad(),detallereque.getId_zona(), detallereque.getIdNecesidad());
              NecesidadesSumiDetalle necdeta=em.find(NecesidadesSumiDetalle.class,necepk);
              necdeta.setMes01Aprobado(detallereque.getDmes1_aprobado());
              necdeta.setMes02Aprobado(detallereque.getDmes2_aprobado());
              necdeta.setMes03Aprobado(detallereque.getDmes3_aprobado());
              necdeta.setMes04Aprobado(detallereque.getDmes4_aprobado());
              necdeta.setMes05Aprobado(detallereque.getDmes5_aprobado());
              necdeta.setMes06Aprobado(detallereque.getDmes6_aprobado());
              necdeta.setMes07Aprobado(detallereque.getDmes7_aprobado());
              necdeta.setMes08Aprobado(detallereque.getDmes8_aprobado());
              necdeta.setMes09Aprobado(detallereque.getDmes9_aprobado());
              necdeta.setMes10Aprobado(detallereque.getDmes10_aprobado());
              necdeta.setMes11Aprobado(detallereque.getDmes11_aprobado());
              necdeta.setMes12Aprobado(detallereque.getDmes12_aprobado());
              necdeta.setMonto_aprobado(detallereque.getMonto_aprobado());
              necdeta.setPrecio(detallereque.getPrecio());
              necdeta.setSubTotalAprobado(detallereque.getSubtotal_aprobado());

              em.merge(necdeta);

            }
           em.flush();
           tx.commit();
        }catch(Exception e){
            tx.rollback();
            throw e;
        }

    }
    


  

}
